package com.springboot.jdk.concurrency;

/**
 * 线程不安全问题
 *
 * @author: zr
 * @date: 2021-09-23
 */
public class ThreadUnsafeDemo {

    private static int data = 0;

    public static void main(String[] args) throws InterruptedException {

        // ThreadUnsafeDemo theadUnsafeDemo = new ThreadUnsafeDemo();
        // ThreadUnsafeDemo theadUnsafeDemo1 = new ThreadUnsafeDemo();
        // ThreadUnsafeDemo theadUnsafeDemo2 = new ThreadUnsafeDemo();

        Thread thread1 = new Thread() {
            @Override
            public void run() {
                for (int j = 0; j < 10; j++) {
                    // data++;
                    // try {
                    //     Thread.sleep(1);
                    // } catch (InterruptedException e) {
                    //     e.printStackTrace();
                    // }
                    // System.out.println("A:" + data);

                    // 第一种使用方法
                    // theadUnsafeDemo.increment1();

                    // 第二种使用方法
                    // synchronized (theadUnsafeDemo) {
                    //     data++;
                    //     System.out.println(data);
                    // }

                    // 第三种用法(错误)
                    // theadUnsafeDemo1.increment();

                    // 第四种用法,类的Class对象进行加锁
                    // ThreadUnsafeDemo.increment();

                    // 第五种用法，对 类的Class对象进行加锁
                    synchronized (ThreadUnsafeDemo.class) {
                        ThreadUnsafeDemo.data++;
                        System.out.println(data);
                    }
                }


            }
        };
        thread1.start();

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for (int j = 0; j < 10; j++) {
                    // try {
                    //     Thread.sleep(1);
                    //     System.out.println("B:" + data);
                    // } catch (InterruptedException e) {
                    //     e.printStackTrace();
                    // }

                    // 第一种使用方法
                    // theadUnsafeDemo.increment1();

                    // 第二种使用方法
                    // synchronized (theadUnsafeDemo) {
                    //     data++;
                    //     System.out.println(data);
                    // }

                    // 第三种用法(错误)
                    // theadUnsafeDemo2.increment();


                    // 第四种用法
                    // ThreadUnsafeDemo.increment();

                    // 第五种用法，对 类的Class对象进行加锁
                    synchronized (ThreadUnsafeDemo.class) {
                        ThreadUnsafeDemo.data++;
                        System.out.println(data);
                    }
                }
            }
        };

        thread2.start();

        System.out.println(data);
    }

    /**
     * 对类对象进行加锁
     *
     * @param
     * @return
     * @throws
     * @date 2021-09-24
     */
    public static synchronized void increment() {
        ThreadUnsafeDemo.data++;
        System.out.println(data);
    }

    /**
     * 对当前这个对象实例进行加锁
     *
     * @param
     * @return
     * @throws
     * @date 2021-09-24
     */
    public synchronized void increment1() {
        data++;
        System.out.println(data);
    }
}
